﻿// ConsoleApplication4.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>
#include <codecvt>
#include <locale.h>
int main()
{
	//c++的string 支持稀碎
	const char* strmsgu8 = u8"1.Life is Importent.人生苦短\n\n";//utf8编码
	const char16_t* strmsgu16 = u"2.Happy is more Importent.及时行乐\n\n";//utf16le编码，c#的string 采用这种编码
	const char32_t* strmsgu32 = U"3.Do not use C++别碰c++.\n\n";//utf32编码

	const char* strmsgANSI = "C++ string is stupid.c++字符串很稀碎\n\n";
	//ANSI(不知道什么编码，仅使用英文时与utf8等价),windows下使用当前编码页，比如gb2312 是 936 代码页
	
	const wchar_t* strmsgW = L"Nerver use that.宽字符尽量别使.\n\n";
	//宽字符编码，不要用，windows 16bit，linux 32bit，扯淡的设计,utf16 or utf32

	//下面的这个字符串转换好像在NDK没有，好在这个转换自己实现也不复杂
	std::wstring_convert<std::codecvt_utf8<char16_t>, char16_t> conv16;
	std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> conv32;
	std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> convwchar;

	std::string strfromw = convwchar.to_bytes(strmsgW);

	std::string str0 = strmsgu8;
	std::string str1 = conv16.to_bytes(strmsgu16);
	std::string str2 = conv32.to_bytes(strmsgu32);

	std::wstring strw0 = convwchar.from_bytes(strmsgu8);
	std::wstring strw1 = convwchar.from_bytes(str1);
	std::wstring strw2 = convwchar.from_bytes(str2);


	printf("==use locale utf-8\n");
	setlocale(LC_CTYPE, "en_US.UTF-8");
	//system("chcp 65001");//调用控制台命令切到utf8 代码页
	printf(strmsgANSI);//编译环境是gb2312，英文部分和utf8相同，正常，中文不正常
	printf(strfromw.c_str());//windows下相当于 utf16->utf8 ,正常
	printf(strmsgu8);//utf8 ,正常
	printf(str1.c_str());//utf16->utf8 ,正常
	printf(str2.c_str());//utf32->utf8 ,正常
	wprintf(strmsgW);
	wprintf(strw0.c_str());
	wprintf(strw1.c_str());
	wprintf(strw2.c_str());
	//system("pause");
	printf("==use locale chs\n");
	setlocale(LC_CTYPE, "chs");
	//system("chcp 936"); //936 代码页
	printf(strmsgANSI);//编译环境是gb2312，936代码页可以正常显示
	printf(strfromw.c_str());//中文异常
	printf(strmsgu8);//中文异常
	printf(str1.c_str());//中文异常
	printf(str2.c_str());//中文异常
	wprintf(strmsgW);
	wprintf(strw0.c_str());
	wprintf(strw1.c_str());
	wprintf(strw2.c_str());
	system("pause");

//	std::cout << "Hello World!\n";
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
